/**
 * GeneradorModeloTabla.java
 * @author Paulo Chang, Carnet 11076
 * @author Oscar Castañeda, Carnet 11086
 * @author Francisco Martínez, Carnet 11096
 * @since 27/10/2011
 * Modificado por última vez el 04/11/2011.
 * Descripción: Clase compuesta por métodos auxiliares estáticos para poder
 * generar el modelo propio de una tabla llena con la información correspondiente
 * a otra tabla propia de la base de datos MySQL.
 */


import java.sql.ResultSetMetaData;
import java.sql.ResultSet;
import javax.swing.table.DefaultTableModel;


public class GeneradorModeloTabla {

    //Métodos
    
    /**
     * Permite rellenar un modelo de tabla con toda la información correspondiente
     * a su contraparte en MySQL.
     * @param informacion ResultSet con la información de la tabla en MySQL.
     * @param modelo Modelo de tabla que se desea llenar con la infomración correspondiente.
     * @param encriptador StringEncrypter que se encuentra encriptando actualmente los datos.
     */
    public static void GenerarModeloTabla(ResultSet informacion, DefaultTableModel modelo, StringEncrypter encriptador){
        configurarColumnas(informacion, modelo);
        vaciarFilas (modelo);
        llenarFilas(informacion, modelo,encriptador);
    }
    
    /**
     * Coloca los nombres de las columnas en la tabla de datos de MySQL en las
     * columnas del modelo de tabla.
     * @param informacion ResultSet que contiene la información de la tabla en MySQL.
     * @param modelo Modelo de tabla en la cual se insertó la información extraída.
     */
    public static void configurarColumnas(ResultSet informacion, DefaultTableModel modelo){
        Object[] titulos = titulosColumnas(informacion);
        modelo.setColumnIdentifiers(titulos);
    }
            
    /**
     * Obtiene los titulos de las columnas de la tabla de MySQL y los regresa.
     * @param informacion ResultSet con la información correspondiente a la tabla en MySQL.
     * @return Object[] Con los titulos de las columnas en la tabla de MySQL.
     */
    public static Object[] titulosColumnas(ResultSet informacion){
        Object[] titulos = null;
        try{
            ResultSetMetaData metaInfo = informacion.getMetaData();
            int numeroCampos = metaInfo.getColumnCount();
            titulos = new Object[numeroCampos];
            for (int i = 0; i < numeroCampos; i++){
                titulos[i] = metaInfo.getColumnLabel(i+1);
            }
        }catch(Exception e){
            System.out.println("Error al realizar metaDatos. Metodo titulosColumnas, GeneradorModeloTabla.");
        }
        return titulos;
    }
    
    /**
     * Vacia todas las filas de un modelo de tabla.
     * @param modelo Modelo sobre el cual se aplicará el cambio.
     */
    public static void vaciarFilas(DefaultTableModel modelo){
        while (modelo.getRowCount() > 0){
            modelo.removeRow(0);
        }
    }
    
    /**
     * Llena las filas de un modelo de tabla con la información obtenida desde MySQL.
     * @param ResultSet con la información obtenida de MySQL.
     * @param DefaultTableModel Modelo de tabla a modificar.
     */
    public static void llenarFilas (ResultSet informacion, DefaultTableModel modelo, StringEncrypter encriptador){
        try{
            while (informacion.next()){
                Object [] datos = new Object[modelo.getColumnCount()];
                for (int i = 0; i < modelo.getColumnCount(); i++){
                    String dato;
                    try{
                        dato = (String)informacion.getObject(i+1);
                    }catch(Exception e){
                        //Si surge una excepción, es porque el dato era un número.
                        dato=Integer.toString((Integer)informacion.getObject(i+1));
                    }
                    try{
                        if(i > 0){
                        dato= (String) encriptador.decrypt(dato);
                        }
                    }catch(Exception ex){
                        //Si surge una excepción, es porque el dato era null, por lo
                        //se reemplaza con una cadena vacía.
                        dato="";
                    }
                    datos[i]=dato;
                }
                modelo.addRow(datos);
            }
            informacion.close();
        }catch(Exception e){
            System.out.println("Error al recorrer la base de datos MySQL. Método llenarFilas, GeneradorModeloTabla.");
        }
    }
}